import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:liuxlcommon/util/toast_util.dart';
import 'package:love_newf/app/com/base/L.dart';
import 'package:love_newf/app/com/listener/global_message_listener.dart';
import 'package:love_newf/app/com/listener/room_message_listener.dart';
import 'package:love_newf/app/com/model/room_data_model.dart';
import 'package:love_newf/app/com/service/user_service.dart';
import 'package:love_newf/app/com/util/my_toast.dart';
import 'package:love_newf/app/page/chat/chat_logic.dart';
import 'package:love_newf/app/page/live/live_logic.dart';
import 'package:love_newf/app/page/login/login_logic.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/log_level_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';

import '../../../../main.dart';

GlobalMessageListener globalMessageListener = GlobalMessageListener();

class ImManage {
  static final ImManage _instance = ImManage._internal();

  // 2. 私有构造函数，防止外部创建实例
  ImManage._internal();

  bool initSuccess = false;

  // 3. 公有的工厂构造函数，返回唯一实例
  factory ImManage() {
    return _instance;
  }

  Future<bool?> initIM() async {
    var appconfig = await L.appConfig;

    // 1. 从即时通信 IM 控制台获取应用 SDKAppID。
    int sdkAppID = int.parse(appconfig.imAppId);
    // 2. 添加 V2TimSDKListener 的事件监听器，sdkListener 是 V2TimSDKListener 的实现类
    V2TimSDKListener sdkListener = V2TimSDKListener(
      onConnectFailed: (int code, String error) {
        // 连接失败的回调函数
        // code 错误码
        // error 错误信息
      },
      onConnectSuccess: () {
        // SDK 已经成功连接到腾讯云服务器
      },
      onConnecting: () {
        // SDK 正在连接到腾讯云服务器
      },
      onKickedOffline: () {
        // 当前用户被踢下线，此时可以 UI 提示用户，并再次调用 V2TIMManager 的 login() 函数重新登录。
      },
      onSelfInfoUpdated: (V2TimUserFullInfo info) {
        // 登录用户的资料发生了更新
        // info登录用户的资料
      },
      onUserSigExpired: () {
        // 在线时票据过期：此时您需要生成新的 userSig 并再次调用 V2TIMManager 的 login() 函数重新登录。
      },
      onUserStatusChanged: (List<V2TimUserStatus> userStatusList) {
        //用户状态变更通知
        //userStatusList 用户状态变化的用户列表
        //收到通知的情况：订阅过的用户发生了状态变更（包括在线状态和自定义状态），会触发该回调
        //在 IM 控制台打开了好友状态通知开关，即使未主动订阅，当好友状态发生变更时，也会触发该回调
        //同一个账号多设备登录，当其中一台设备修改了自定义状态，所有设备都会收到该回调
      },
    );
    // 3.初始化SDK
    V2TimValueCallback<bool> initSDKRes =
        await TencentImSDKPlugin.v2TIMManager.initSDK(
      sdkAppID: sdkAppID, // SDKAppID
      loglevel: isTest
          ? LogLevelEnum.V2TIM_LOG_ALL
          : LogLevelEnum.V2TIM_LOG_INFO, // 日志登记等级
      listener: sdkListener, // 事件监听器
    );
    if (initSDKRes.code == 0) {
      //初始化成功
      initSuccess = true;
    }

    return initSuccess;
  }

  Future<bool> login() async {
    var info = await UserService().getUserInfo();
    if (info == null) return false;

    String userID = info.userId.toString();
    String userSig = L.loginUserInfo?.imSign ?? "";
    V2TimCallback res = await TencentImSDKPlugin.v2TIMManager
        .login(userID: userID, userSig: userSig);
    if (res.code == 0) {
      addAdvancedMsgListener();
      initSuccess = true;
    } else {
      toastError("登录失败${res.desc}");
      initSuccess = false;
      return false;
    }

    return true;
  }

  V2TimAdvancedMsgListener advancedMsgListener = V2TimAdvancedMsgListener(
    onRecvC2CReadReceipt: (List<V2TimMessageReceipt> receiptList) {
      // _msgListenerData = 'onRecvC2CReadReceipt $receiptList';
      // _callbackList.add("${getCurrentTime()}AdvancedMsgListener onRecvC2CReadReceipt");
      // increment();
      // notifyListeners();

      //单聊已读回调
    },
    onRecvMessageModified: (V2TimMessage message) {
      // _msgListenerData = 'onRecvMessageModified ${message.toJson()}';
      // _callbackList.add("${getCurrentTime()}AdvancedMsgListener onRecvMessageModified");
      // increment();
      // notifyListeners();

      // msg 为被修改之后的消息对象
    },
    onRecvMessageReadReceipts: (List<V2TimMessageReceipt> receiptList) {
      // _msgListenerData = 'onRecvMessageReadReceipts $receiptList';
      // _callbackList.add("${getCurrentTime()}AdvancedMsgListener onRecvMessageReadReceipts");
      // increment();
      // notifyListeners();
    },
    onRecvMessageRevoked: (String messageid) {
      // 在本地维护的消息中处理被对方撤回的消息
      // _msgListenerData = 'onRecvMessageRevoked $messageid';
      // _callbackList.add("${getCurrentTime()}AdvancedMsgListener onRecvMessageRevoked");
      // increment();
      // notifyListeners();
    },
    onRecvNewMessage: (V2TimMessage message) async {
      /// 新消息通知
      if (kDebugMode) {
        print('onRecvNewMessage ${message.toJson()}');
      }

      String m = "";
      // 使用自定义消息,只用到了之定义消息
      if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) {
        m = "custom ${message.customElem?.data}";
        // if (kDebugMode) {
        //   print('onRecvNewMessage $m');
        // }

        globalMessageListener.call(RoomDataModel.fromJson(json.decode(m)));
      } else if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) {
        m = "text ${message.textElem?.text}";
      }
      if (message.groupID != null) {
        LiveLogic.logic?.receiveMessage(message);
      } else {
        try {
          Get.find<ChatLogic>().receiveMessage(message);
        } catch (e) {}
      }
    },
    onSendMessageProgress: (V2TimMessage message, int progress) {
      //文件上传进度回调
      // _msgListenerData = 'onSendMessageProgress ${message.toJson()}';
      // _callbackList.add("${getCurrentTime()}AdvancedMsgListener onSendMessageProgress");
      // increment();
      // notifyListeners();
    },
    onRecvMessageReactionsChanged: (changeInfos) {
      print(
          "onRecvMessageReactionsChanged ${changeInfos.map((e) => e.toJson()).toList()}");
    },
  );

  Future<void> addAdvancedMsgListener() async {
    //先移除，在添加
    // removeAdvancedMessageListener();

    await TencentImSDKPlugin.v2TIMManager
        .getMessageManager()
        .addAdvancedMsgListener(listener: advancedMsgListener);

    //先移除，在添加
    await TencentImSDKPlugin.v2TIMManager
        .removeGroupListener(listener: v2timGroupListener);
    //群消息监听，礼物，麦上信息等
    await TencentImSDKPlugin.v2TIMManager
        .addGroupListener(listener: v2timGroupListener);
  }

  void removeAdvancedMessageListener() {
    TencentImSDKPlugin.v2TIMManager
        .getMessageManager()
        .removeAdvancedMsgListener(listener: advancedMsgListener);
  }

  Future<V2TimMessage?> sendMessage(String text, {receiver, groupID}) async {
    // 创建文本消息
    V2TimValueCallback<V2TimMsgCreateInfoResult> createTextMessageRes =
        await TencentImSDKPlugin.v2TIMManager
            .getMessageManager()
            .createTextMessage(
              text: text, // 文本信息
            );
    if (createTextMessageRes.code == 0) {
      // 文本信息创建成功
      String? id = createTextMessageRes.data?.id;
      // 发送文本消息
      // 在sendMessage时，若只填写receiver则发个人用户单聊消息
      //                 若只填写groupID则发群组消息
      //                 若填写了receiver与groupID则发群内的个人用户，消息在群聊中显示，只有指定receiver能看见
      V2TimValueCallback<V2TimMessage> sendMessageRes =
          await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage(
              id: id!,
              // 创建的messageid
              receiver: receiver ?? "",
              // 接收人id
              groupID: groupID ?? "",
              // 接收群组id
              priority: MessagePriorityEnum.V2TIM_PRIORITY_DEFAULT,
              // 消息优先级
              onlineUserOnly: false,
              // 是否只有在线用户才能收到，如果设置为 true ，接收方历史消息拉取不到，常被用于实现“对方正在输入”或群组里的非重要提示等弱提示功能，该字段不支持 AVChatRoom。
              isExcludedFromUnreadCount: false,
              // 发送消息是否计入会话未读数
              isExcludedFromLastMessage: false,
              // 发送消息是否计入会话 lastMessage
              needReadReceipt: false,
              // 消息是否需要已读回执（只有 Group 消息有效，6.1 及以上版本支持，需要您购买旗舰版套餐）
              offlinePushInfo: OfflinePushInfo(),
              // 离线推送时携带的标题和内容
              cloudCustomData: "",
              // 消息云端数据，消息附带的额外的数据，存云端，消息的接收者可以访问到
              localCustomData:
                  "" // 消息本地数据，消息附带的额外的数据，存本地，消息的接收者不可以访问到，App 卸载后数据丢失
              );
      if (sendMessageRes.code == 0) {
        // 发送成功，需要给自己创建一条消息。
        V2TimMessage msg = sendMessageRes.data!;
        msg.cloudCustomData =
            json.encode({"sendUserInfo": json.encode(L.userInfo)});
        return msg;
      }
      return null;
    }
  }
}
